home *** CD-ROM | disk | FTP | other *** search
- //$VER:Dos_Comp 1.4 (04.07.100)
- class dos_comp
- {
- public:
-
- // Parts:
- // none ignored
- // device part before ':' 1.x
- // path parts before last '/' 1.x
- // drawer parts between ':' and last '/' 1.x
- // name part after last '/' 1.x
- // extension part after last '.' 1.3
- // noext like name, but without extension 1.3
-
- enum part{none,device,drawer,path,name,extension,noext};
-
- static int get(char* input,char* output, part chunk, int maxsize=255){
- char* out_start=output;
- char* in_start=input;
- char* last=0;
-
- switch (chunk){
-
- case device:
- *output=*input;
- do{
- output++;input++;
- *output=*input;}
- while (*input != ':' && *input && --maxsize);
- if (*input != ':') {*out_start=0;return 5;}
- *(++output)=0;
- break;
-
- case drawer:
- while (*input!=':' && *input!='/' && *input) input++;
- switch (*input){
- case ':':
- in_start = ++input;
- break;
-
- case '/':
- input=in_start;
- break;
-
- case 0:
- return 5;
-
- default:
- break;}
- // Continues to case path:
-
- case path:
- while(*input){
- if ( *input=='/' || *input==':' ) last=input;
- input++;}
- if (last){
- input=in_start;
- *output=*input;
- do{
- output++;input++;
- *output=*input;}
- while(input!=last && --maxsize);
- output++;
- *output=0;}
- else{
- *out_start=0;
- return 5;}
- break;
-
- case noext:
- last=in_start;
- // Skip dirs and remember start of filename
- while(*input){
- if ( *input=='/' || *input==':' ) last=input+1;
- input++;}
- input=last;
-
- // Copy name
- while(*last && --maxsize){
- *output=*last;
- output++;last++;}
- *output=0;
-
- // Remove extension
- while (output!=input)
- {
- switch (*output)
- {
- case '.':
- *output=0;
- output=input;
- break;
-
- case ':':
- case '/':
- output=input;
- break;
-
- default:
- output--;
- break;
- }
- }
- break;
-
- case name:
- last=in_start;
- while(*input){
- if ( *input=='/' || *input==':' ) last=input+1;
- input++;}
- while(*last && --maxsize){
- *output=*last;
- output++;last++;}
- *output=0;
- break;
-
- case extension:
- //Find end
- while (*input) input++;
- //Rewind to a '.' ':' or '/'
- int loop=1;
- while (loop && input!=in_start)
- {
- switch (*input)
- {
- // Extension found
- case '.':
- input++;
- while (int(*(output++)=*(input++)) && --maxsize);
- loop=0;
- break;
-
- // No extension found
- case '/':
- case ':':
- loop=0;
- break;
-
- default:
- input--;
- break;
- }
- }
- break;
- }
- return 0;
- }
- };
-